#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

struct Stu
{
	char name[20];
	int age;
};

void print_int(int arr[], int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
}

void print_float(float arr[], int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%.2f ", arr[i]);
	}
}

void print_struct_Stu(struct Stu arr[], int sz)
{
	for (int i = 0;i < sz;i++)
	{
		printf("%s ",arr[i].name);
	}
}

int cmp_int(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}

int cmp_float(const void* p1, const void* p2)
{
	if ((*((float*)p2)) > (*((float*)p1)))
	{
		return 1;
	}
	else if ((*((float*)p2)) < (*((float*)p1)))
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

int cmp_char(const void* p1, const void* p2)
{
	return (*((char*)p1)) - (*((char*)p2));
}

int cmp_struct_name(const void* p1, const void* p2)
{
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}

void test1(void)
{
	int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_int(arr, sz);
}

void test2(void)
{
	float arr[10] = { 1.1f,1.2f,1.3f,1.4f,1.5f,1.6f,1.7f,1.8f,1.9f,2.0f };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_float);
	print_float(arr, sz);
}

void test3(void)
{
	char arr[] = "cba";
	int sz = strlen(arr);
	qsort(arr, sz, sizeof(arr[0]), cmp_char);
	printf("%s", arr);
}

void test4(void)
{
	struct Stu arr[3] = { {"zhangsan",18},{"lisi",35},{"wangwu",20} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_struct_name);
	print_struct_Stu(arr, sz);
}

int main()
{
	test1();	//实现int类型数据排序（升序）
	printf("\n");
	test2();    //实现float类型数据排序（降序）
	printf("\n");
	test3();    //实现字符类型数据排序（升序）
	printf("\n");
	test4();	//实现结构体类型数据排序（首个元素字符串,升序）
	printf("\n");
	return 0;
}

